home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / include / ieee754.h < prev    next >
C/C++ Source or Header  |  2008-09-29  |  5KB  |  200 lines

  1. /* Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc.
  2.    This file is part of the GNU C Library.
  3.  
  4.    The GNU C Library is free software; you can redistribute it and/or
  5.    modify it under the terms of the GNU Lesser General Public
  6.    License as published by the Free Software Foundation; either
  7.    version 2.1 of the License, or (at your option) any later version.
  8.  
  9.    The GNU C Library is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.    Lesser General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU Lesser General Public
  15.    License along with the GNU C Library; if not, write to the Free
  16.    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  17.    02111-1307 USA.  */
  18.  
  19. #ifndef _IEEE754_H
  20.  
  21. #define _IEEE754_H 1
  22. #include <features.h>
  23.  
  24. #include <endian.h>
  25.  
  26. __BEGIN_DECLS
  27.  
  28. union ieee754_float
  29.   {
  30.     float f;
  31.  
  32.     /* This is the IEEE 754 single-precision format.  */
  33.     struct
  34.       {
  35. #if    __BYTE_ORDER == __BIG_ENDIAN
  36.     unsigned int negative:1;
  37.     unsigned int exponent:8;
  38.     unsigned int mantissa:23;
  39. #endif                /* Big endian.  */
  40. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  41.     unsigned int mantissa:23;
  42.     unsigned int exponent:8;
  43.     unsigned int negative:1;
  44. #endif                /* Little endian.  */
  45.       } ieee;
  46.  
  47.     /* This format makes it easier to see if a NaN is a signalling NaN.  */
  48.     struct
  49.       {
  50. #if    __BYTE_ORDER == __BIG_ENDIAN
  51.     unsigned int negative:1;
  52.     unsigned int exponent:8;
  53.     unsigned int quiet_nan:1;
  54.     unsigned int mantissa:22;
  55. #endif                /* Big endian.  */
  56. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  57.     unsigned int mantissa:22;
  58.     unsigned int quiet_nan:1;
  59.     unsigned int exponent:8;
  60.     unsigned int negative:1;
  61. #endif                /* Little endian.  */
  62.       } ieee_nan;
  63.   };
  64.  
  65. #define IEEE754_FLOAT_BIAS    0x7f /* Added to exponent.  */
  66.  
  67.  
  68. union ieee754_double
  69.   {
  70.     double d;
  71.  
  72.     /* This is the IEEE 754 double-precision format.  */
  73.     struct
  74.       {
  75. #if    __BYTE_ORDER == __BIG_ENDIAN
  76.     unsigned int negative:1;
  77.     unsigned int exponent:11;
  78.     /* Together these comprise the mantissa.  */
  79.     unsigned int mantissa0:20;
  80.     unsigned int mantissa1:32;
  81. #endif                /* Big endian.  */
  82. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  83. # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
  84.     unsigned int mantissa0:20;
  85.     unsigned int exponent:11;
  86.     unsigned int negative:1;
  87.     unsigned int mantissa1:32;
  88. # else
  89.     /* Together these comprise the mantissa.  */
  90.     unsigned int mantissa1:32;
  91.     unsigned int mantissa0:20;
  92.     unsigned int exponent:11;
  93.     unsigned int negative:1;
  94. # endif
  95. #endif                /* Little endian.  */
  96.       } ieee;
  97.  
  98.     /* This format makes it easier to see if a NaN is a signalling NaN.  */
  99.     struct
  100.       {
  101. #if    __BYTE_ORDER == __BIG_ENDIAN
  102.     unsigned int negative:1;
  103.     unsigned int exponent:11;
  104.     unsigned int quiet_nan:1;
  105.     /* Together these comprise the mantissa.  */
  106.     unsigned int mantissa0:19;
  107.     unsigned int mantissa1:32;
  108. #else
  109. # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
  110.     unsigned int mantissa0:19;
  111.     unsigned int quiet_nan:1;
  112.     unsigned int exponent:11;
  113.     unsigned int negative:1;
  114.     unsigned int mantissa1:32;
  115. # else
  116.     /* Together these comprise the mantissa.  */
  117.     unsigned int mantissa1:32;
  118.     unsigned int mantissa0:19;
  119.     unsigned int quiet_nan:1;
  120.     unsigned int exponent:11;
  121.     unsigned int negative:1;
  122. # endif
  123. #endif
  124.       } ieee_nan;
  125.   };
  126.  
  127. #define IEEE754_DOUBLE_BIAS    0x3ff /* Added to exponent.  */
  128.  
  129.  
  130. union ieee854_long_double
  131.   {
  132.     long double d;
  133.  
  134.     /* This is the IEEE 854 double-extended-precision format.  */
  135.     struct
  136.       {
  137. #if    __BYTE_ORDER == __BIG_ENDIAN
  138.     unsigned int negative:1;
  139.     unsigned int exponent:15;
  140.     unsigned int empty:16;
  141.     unsigned int mantissa0:32;
  142.     unsigned int mantissa1:32;
  143. #endif
  144. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  145. # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
  146.     unsigned int exponent:15;
  147.     unsigned int negative:1;
  148.     unsigned int empty:16;
  149.     unsigned int mantissa0:32;
  150.     unsigned int mantissa1:32;
  151. # else
  152.     unsigned int mantissa1:32;
  153.     unsigned int mantissa0:32;
  154.     unsigned int exponent:15;
  155.     unsigned int negative:1;
  156.     unsigned int empty:16;
  157. # endif
  158. #endif
  159.       } ieee;
  160.  
  161.     /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
  162.     struct
  163.       {
  164. #if    __BYTE_ORDER == __BIG_ENDIAN
  165.     unsigned int negative:1;
  166.     unsigned int exponent:15;
  167.     unsigned int empty:16;
  168.     unsigned int one:1;
  169.     unsigned int quiet_nan:1;
  170.     unsigned int mantissa0:30;
  171.     unsigned int mantissa1:32;
  172. #endif
  173. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  174. # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
  175.     unsigned int exponent:15;
  176.     unsigned int negative:1;
  177.     unsigned int empty:16;
  178.     unsigned int mantissa0:30;
  179.     unsigned int quiet_nan:1;
  180.     unsigned int one:1;
  181.     unsigned int mantissa1:32;
  182. # else
  183.     unsigned int mantissa1:32;
  184.     unsigned int mantissa0:30;
  185.     unsigned int quiet_nan:1;
  186.     unsigned int one:1;
  187.     unsigned int exponent:15;
  188.     unsigned int negative:1;
  189.     unsigned int empty:16;
  190. # endif
  191. #endif
  192.       } ieee_nan;
  193.   };
  194.  
  195. #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
  196.  
  197. __END_DECLS
  198.  
  199. #endif /* ieee754.h */
  200.